perm filename TOWER[L70,TES] blob
sn#009935 filedate 1972-05-22 generic text, type T, neo UTF8
00100 % TWO VERSIONS OF "TOWER" ARE PRESENTED.
00200 "TWOTOWERS" IS THE SAME IN BOTH VERSIONS %
00300
00400 EXPR TWOTOWERS(H1, H2) ;
00500 LIST(TOWER(H1), TOWER(H2)) ;
00600
00700 % * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
00800 VERSION 1 --
00900 THE ARGUMENT OF "CHOICE" IS THE NUMBER OF BLOCKS
01000 THAT REMAIN %
01100
01200 EXPR TOWER(HEIGHT) ;
01300 IF HEIGHT = 0 THEN NIL
01400 ELSE IF HEIGHT LESSP 0 THEN FAILURE()
01500 ELSE BEGIN
01600 NEW WHICH, WHAT ;
01700 WHICH ← CHOICE(LENGTH(BLOCKS)) ;
01800 WHAT ← NTH(WHICH, BLOCKS) ;
01900 BLOCKS ← REMOVE(WHICH, BLOCKS) ;
02000 RETURN (WHAT CONS TOWER(HEIGHT-WHAT)) ;
02100 END ;
02200
02300 EXPR NTH(N,L) ; IF N=1 THEN CAR L ELSE NTH(N-1, CDR L) ;
02400
02500 EXPR REMOVE(N, L) ; IF N=1 THEN CDR L ELSE CAR L CONS REMOVE(N-1, CDR L) ;
02600
02700
02800 % * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
02900 VERSION 2 --
03000 THE ARGUMENT OF "CHOICE" IS ALWAYS 2 -- CAR VS.
03100 CDR. THIS VERSION IS MUCH MORE EFFICIENT THEN
03200 VERSION 1. %
03300
03400 EXPR TOWER(HEIGHT) ;
03500 BEGIN
03600 NEW PILE ;
03700 PILE ← BLOCKS ; BLOCKS ← NIL ;
03800 RETURN TOWER1(HEIGHT, PILE) ;
03900 END ;
04000
04100 % THE TOWER IS BUILT FROM "PILE" AND UNUSED BLOCKS
04200 ARE RETURNED TO "BLOCKS". IF CHOICE(2)=1, THEN
04300 CAR(PILE) IS PUT ON THE TOWER; IF CHOICE(2)=2,
04400 THEN CAR(PILE) IS RETURNED TO "BLOCKS". %
04500
04600 EXPR TOWER1(HEIGHT, PILE) ;
04700 IF HEIGHT=0 THEN PROG2( BLOCKS ← APPEND(PILE,BLOCKS) , NIL )
04800 ELSE IF HEIGHT LESSP 0 OR NULL(PILE) THEN FAILURE()
04900 ELSE IF CHOICE(2)=1 THEN
05000 CAR(PILE) CONS TOWER1(HEIGHT-CAR(PILE), CDR(PILE))
05100 ELSE PROG2( BLOCKS ← CAR(PILE) CONS BLOCKS,
05200 TOWER1(HEIGHT, CDR(PILE)) ) ;